FIFOのAmazon SQSが2年越しで東京上陸!Exactly-Onceなキューが東京でも利用可能
大栗です。
SQSは1つのメッセージに対して複数回取ってしまう事があるので後続処理は冪等(べきとう)にせよ、と言われていました。それを不要にするためにFIFOのExactly-Onceなキューが発表されましたが、東京で使えず早2年が経とうとしていました。それがやっと東京にFIFOのSQSが東京に上陸しました!
- Amazon SQS FIFO Queues Now Available in Asia Pacific (Tokyo) and Asia Pacific (Sydney) Regions
- Amazon SQS FIFO (First-In-First-Out) Queues
Amazon SQS FIFOキュー
今まで使用していた標準キューは高いパフォーマンスを発揮しますが、以下の2点について難点がありました。そのため順序に依存しなかったり複数回実行しても問題がないように冪等な処理を書く必要がありました。
- 順序が保証されない
- メッセージを複数回取り出せてしまう可能性がある
この難点を解決したのがFIFOキューとなります。詳細については、以下のエントリーを御覧ください。
今回東京とシドニーが増えて、6リージョンでFIFOキューが利用できます。
- 米国東部 (バージニア北部)
- 米国東部 (オハイオ)
- 米国西部 (オレゴン)
- EU (アイルランド)
- アジアパシフィック (シドニー) ← New
- アジアパシフィック (東京) ← New
注意
性能について
- デフォルトでは、FIFO キューはバッチ処理により 1 秒あたり最大 3,000 件のメッセージをサポートします。制限の引き上げをリクエストする場合は、サポートリクエストを提出(クラスメソッド メンバーズにご加入の場合は弊社問い合わせ窓口へ)してください。
- バッチ処理なしでは、FIFO キューは、1 秒あたり最大 300 件のメッセージ (1 秒あたり 300 件の送信、受信、または削除オペレーション) をサポートします。
標準キューは、 アクションあたり、ほぼ無制限の数の 1 秒あたりのトランザクション (TPS) をサポートしているため、高いパフォーマンスが必要なワークロードではFIFOキューではなく標準キューの利用をお勧めします。
名称
FIFOキューはキュー名を.fifo
で終わらせる必要があります。
他サービスとの連携
FIFOキューはSNSとの連携やLambdaとの連携をサポートしていませんので注意しましょう。
キューの移行
既存の標準キューをFIFOキューへ変換することはできません。新しいFIFOキューを作成するか、既存の標準キューを削除してFIFOキューとして再作成する必要があります。
デッドレターキュー
FIFO キューのデッドレターキューは、FIFO キューである必要があります。
やってみた
東京リージョンでSQSのコンソールを開きます。ここで新しいキューの作成
をクリックします。
ここではキュー名にblog.fifo
としてFIFO キュー
を選択します。詳細な設定内容を確認するため、一番下のキューの設定
をクリックします。
キュー名が.fifo
で終わっていないの以下のメッセージが表示されるので注意しましょう。
キューの名前 (blog) には無効な文字が含まれます。FIFO キューの名前は .fifo のサフィックスで終わる必要があります。
以下の様にキューの設定を行いました。
キューの属性
はデフォルト値のままです。
項目 | 設定値 | 備考 |
---|---|---|
デフォルトの可視性タイムアウト | 30 秒 | |
メッセージ保持期間 | 4 日 | |
最大メッセージサイズ | 256 KB | |
配信遅延 | 0 秒 | |
メッセージ受信待機時間 | 0 秒 | |
コンテンツに基づく重複排除 | チェックなし |
今回はデッドレターキュー設定
を設定しません。必要に応じて設定しましょう。
項目 | 設定値 | 備考 |
---|---|---|
再処理ポリシーの使用 | チェックなし | |
デッドレターキュー | ー | |
最大受信数 | ー |
基本的にはサーバー側の暗号化 (SSE) の設定
は設定しておきましょう。
項目 | 設定値 | 備考 |
---|---|---|
SSE の使用 | チェック | |
AWS KMS カスタマーマスターキー (CMK) | (デフォルト) aws/sqs | 別アカウントからのアクセスができないキー |
データキー再利用期間 | 5 分 |
この様に作成されます。
AWS CLIでメッセージを送ってみます。標準キューと異なり、メッセージグループ ID(message-group-id)とメッセージ重複排除 ID(message-deduplication-id)が必要です。
$ aws sqs send-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/blog.fifo \ > --region ap-northeast-1 --message-body Developers.IO \ > --message-group-id group1 --message-deduplication-id deduplication1 { "MD5OfMessageBody": "12345bec1c6be3e6d735971111cf9f90", "SequenceNumber": "12345678901234567890", "MessageId": "42f4c284-1234-abcd-8345-a72f97fefeb1" }
メッセージを取り出してみます。
$ aws sqs receive-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/289237286173/blog.fifo \ > --region ap-northeast-1 --attribute-names All { "Messages": [ { "Body": "Developers.IO", "Attributes": { "ApproximateFirstReceiveTimestamp": "1234567890123", "SequenceNumber": "12345678901234567890", "SenderId": "AIDAILG5DTK2YKXN3AU4W", "MessageDeduplicationId": "deduplication1", "SentTimestamp": "1234567890123", "ApproximateReceiveCount": "1", "MessageGroupId": "group1" }, "ReceiptHandle": "dfgshjkdlfghjklscdhtyterwdbfjtu54yt3wfgdhru765twsgdhfju7635wrfsgdhru574635rfsgdhru4635rfsgdhu576532rqfsdfjtu7654253647urhdgsfrq25364yrufdsfafghjur4637446352rqwgdhgssdghfeytwsdhry46egdsfarq253yedgsfr523egsfasghdjrit58746352qrwhdfjncbxvzgseyur58746352qrtsghdnbfatwy37652qrshdjfgfarq45rfagswt367DTifgujvFTu=", "MD5OfBody": "12345bec1c6be3e6d735971111cf9f90", "MessageId": "42f4c284-1234-abcd-8345-a72f97fefeb1" } ] }
さいごに
発表から2年が経ってようやく東京でもFIFOキューが利用可能になりました。FIFOキューを使いたいが為に太平洋を越えてメッセージのやり取りを行うパターンもありましたが、今回のリージョン追加で東京リージョン内で解決できるようになりました。
FIFOはとても有用な機能ですが、高いパフォーマンスが必要だったり、別のサービスとの連携(SNSやLambda)が必要な場合には標準キューを利用しましょう。